﻿''' <summary>
''' Clase que hara consultas a la base de datos.
''' </summary>
''' <remarks></remarks>
''' 

Public Class Ejecutor
    'Variables de la clase

    Private sqlConexion As System.Data.SqlClient.SqlConnection
    Private sqlAdaptador As System.Data.SqlClient.SqlDataAdapter
    Private sqlReader As System.Data.SqlClient.SqlDataReader
    Private strMensajeError As String


    ''' <summary>
    ''' Constructor Inicializamos la conexion
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        Dim strCadenaConexion As String

        'strCadenaConexion = ConfigurationSettings.AppSettings("miConexion")
        strCadenaConexion = System.Configuration.ConfigurationManager.ConnectionStrings("SiiabCanAdoConnectionString").ConnectionString
        'strCadenaConexion = New System.Data.SqlClient.SqlConnection(ConfigurationSettings.AppSettings("MiconexionTrackit"))
        Try
            Me.sqlConexion = New System.Data.SqlClient.SqlConnection(strCadenaConexion)
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
    End Sub

    Public Sub New(ByVal strCadena As String)
        Dim strCadenaConexion As String
        strCadenaConexion = strCadena
        Try
            Me.sqlConexion = New System.Data.SqlClient.SqlConnection(strCadenaConexion)
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que se encarga de abrir la conexion a la base de Datos
    ''' </summary>
    ''' <remarks></remarks>

    Protected Sub abrirConexion()
        If Not Me.sqlConexion.State = System.Data.ConnectionState.Open Then
            Me.sqlConexion.Open()

        End If
    End Sub

    ''' <summary>
    ''' Metodo que se encarga de cerrar la conexion a la base de Datos
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub cerrarConexion()
        If Me.sqlConexion.State = System.Data.ConnectionState.Open Then
            Me.sqlConexion.Close()
        End If
    End Sub

    ''' <summary>
    ''' Metodo que se encarga  de realizar una consulta en SQL, y obtiene un Data Set con todos los valores de la consulta
    ''' </summary>
    ''' <param name="strQuery">Query a ejecutar en la consulta</param>
    ''' <returns> Data Set con el resultado de la consulta </returns>
    ''' <remarks></remarks>
    Public Function consultaSQL(ByVal strQuery As String) As Data.DataSet
        Dim dsResultado As Data.DataSet = New Data.DataSet()
        Try
            abrirConexion()
            Me.sqlAdaptador = New System.Data.SqlClient.SqlDataAdapter(strQuery, Me.sqlConexion)
            Me.sqlAdaptador.Fill(dsResultado)
            cerrarConexion()
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
        Return dsResultado
    End Function
    ''' <summary>
    ''' Método que realiza una consulta en sql y regresa un valor True si existen algun resultado
    ''' o un valor False si no existe ningun registro que cumpla con la condición de la consulta
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CompruebaExistenciaEnBD(ByVal strQuery As String) As Boolean
        Dim dsResultado As New System.Data.DataSet()
        Dim sqlComando As New System.Data.SqlClient.SqlCommand()

        Try
            sqlComando.CommandText = strQuery
            abrirConexion()
            Me.sqlAdaptador = New System.Data.SqlClient.SqlDataAdapter(strQuery, Me.sqlConexion)
            Me.sqlAdaptador.Fill(dsResultado)
            cerrarConexion()

            If dsResultado.Tables.Count > 0 Then
                Return True
            Else
                Return False
            End If

        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
    End Function
    ''' <summary>
    ''' Metodo que se encarga de realizar una consulta que regresara un valor entero de la base de datos, 
    ''' ideal para consultas con Count o aquellas que regresen un solo valor entero
    ''' </summary>
    ''' <param name="strQuery">Query de la consulta a ejecutar</param>
    ''' <returns>Entero con el resultado de la consulta</returns>
    ''' <remarks></remarks>
    Public Function consultaEscalar(ByVal strQuery As String) As Integer
        Dim intResultado As Integer = 0
        Dim sqlComando As System.Data.SqlClient.SqlCommand
        Try
            sqlComando = New System.Data.SqlClient.SqlCommand()
            sqlComando.CommandText = strQuery
            abrirConexion()
            sqlComando.Connection = Me.sqlConexion
            intResultado = Convert.ToInt32(sqlComando.ExecuteScalar().ToString())
            cerrarConexion()
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
        Return intResultado
    End Function

    ''' <summary>
    ''' Metodo que se encarga de obtener un solo resultado en formato de Cadena desde la Base de Datos
    ''' </summary>
    ''' <param name="strQuery">Query con el resultado de la cadena</param>
    ''' <returns>Cadena que regresa el resultado de la base de datos</returns>
    ''' <remarks></remarks>
    Public Function consultaEscalarCadena(ByVal strQuery As String) As String
        Dim strResultado As String = String.Empty
        Dim sqlComando As System.Data.SqlClient.SqlCommand
        Try
            sqlComando = New System.Data.SqlClient.SqlCommand()
            sqlComando.CommandText = strQuery
            abrirConexion()
            sqlComando.Connection = Me.sqlConexion
            strResultado = sqlComando.ExecuteScalar().ToString()
            cerrarConexion()
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
        Return strResultado
    End Function

    ''' <summary>
    ''' Metodo que se encarga de realizar un cambio en TransactSQl y que regresa el numero de filas afectadas por la operacion
    ''' </summary>
    ''' <param name="strQuery">Query que modificara la informacion de la Base de Datos</param>
    ''' <returns>Nuemero de Filas afectadas por la operacion</returns>
    ''' <remarks></remarks>
    Public Function realizarCambioSQL(ByVal strQuery As String) As Integer
        Dim intOperacion As Integer
        Dim sqlComando As System.Data.SqlClient.SqlCommand
        Try
            sqlComando = New System.Data.SqlClient.SqlCommand()
            sqlComando.CommandText = strQuery
            abrirConexion()
            sqlComando.Connection = Me.sqlConexion
            intOperacion = sqlComando.ExecuteNonQuery()
            cerrarConexion()
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
        Return intOperacion
    End Function

    Protected Overrides Sub Finalize()
        'Liberamos los recursos        
        'Destruimos todo lo anterior
        MyBase.Finalize()
    End Sub

    ''' <summary>
    ''' Método que obtienen el reader
    ''' </summary>
    ''' <param name="strQuery"></param>
    ''' <param name="sqrResultado">data reader</param>
    ''' <remarks></remarks>
    Public Sub obtenerReader(ByVal strQuery As String, ByRef sqrResultado As System.Data.SqlClient.SqlDataReader)
        Dim sqlComando As System.Data.SqlClient.SqlCommand
        Try
            sqlComando = New System.Data.SqlClient.SqlCommand()
            sqlComando.CommandText = strQuery
            abrirConexion()
            sqlComando.Connection = Me.sqlConexion
            sqrResultado = sqlComando.ExecuteReader
            cerrarConexion()
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que trae la cadena de Conexion que se esta usando actualmente
    ''' </summary>
    ''' <returns>Cadena de Conexion</returns>
    ''' <remarks></remarks>
    Public Function obtenerCadenaConexion() As System.Data.SqlClient.SqlConnection
        Return Me.sqlConexion
    End Function

    ''' <summary>
    ''' Metdoo que se encarga de Abrir la Cadena de Conexion
    ''' </summary>
    ''' <returns>Regresa 1 se se ha hecho correctamente</returns>
    ''' <remarks></remarks>
    Public Function abrirCadenaConexion() As Integer
        Try
            Me.sqlConexion.Open()
            Return 1
        Catch ex As Exception
            Return 0
        End Try
    End Function

    ''' <summary>
    ''' Metdoo que se encarga de Cerrar la Cadena de Conexion
    ''' </summary>
    ''' <returns>Regresa 1 si se ha hecho correctamente</returns>
    ''' <remarks></remarks>
    Public Function cerrarCadenaConexion() As Integer
        Try
            Me.sqlConexion.Open()
            Return 1
        Catch ex As Exception
            Return 0
        End Try
    End Function


    ''' <summary>
    ''' Metodo que se encarga de realizar un cambio en TransactSQl y que regresa el numero de filas afectadas por la operacion
    ''' Se sugiere este metodo para insert, update o delete masivos.
    ''' </summary>
    ''' <param name="strQuery">Query que modificara la informacion de la Base de Datos</param>
    ''' <returns>Nuemero de Filas afectadas por la operacion</returns>
    ''' <remarks></remarks>
    Public Function realizarTransactCambiosSQL(ByVal strQuery As String) As Integer
        Dim intOperacion As Integer
        Dim sqlComando As New System.Data.SqlClient.SqlCommand

        Try

            sqlComando.CommandText = strQuery
            abrirConexion()
            sqlComando.Connection = Me.sqlConexion
            sqlComando.CommandTimeout = 600000
            sqlComando.Transaction = Me.sqlConexion.BeginTransaction()
            intOperacion = sqlComando.ExecuteNonQuery()
            If (intOperacion > 0) Then
                sqlComando.Transaction.Commit()
            Else
                sqlComando.Transaction.Rollback()

            End If
        Catch ex As Exception
            intOperacion = -1
            strMensajeError = ex.Message
            Try
                sqlComando.Transaction.Rollback()
            Catch ex2 As Exception
                strMensajeError = ex.Message
            End Try

        Finally
            If Me.sqlConexion.State = System.Data.ConnectionState.Open Then
                cerrarConexion()
            End If
        End Try
        Return intOperacion
    End Function

    ''' <summary>
    ''' Metodo que se encarga de realizar un cambio en TransactSQl y que regresa el numero de filas afectadas por la operacion
    ''' Se sugiere este metodo para insert, update o delete masivos.
    ''' </summary>
    ''' <param name="strQuery">Query que modificara la informacion de la Base de Datos</param>
    ''' <returns>Nuemero de Filas afectadas por la operacion</returns>
    ''' <remarks></remarks>
    Public Function consultaStoreProcedure(ByVal strQuery As String) As Integer
        Dim intOperacion As Integer
        Dim sqlComando As New System.Data.SqlClient.SqlCommand

        Try

            sqlComando.CommandText = strQuery
            abrirConexion()
            sqlComando.Connection = Me.sqlConexion
            sqlComando.CommandTimeout = 600000
            sqlComando.Transaction = Me.sqlConexion.BeginTransaction()
            intOperacion = sqlComando.ExecuteNonQuery()
            If (intOperacion > 0) Then
                sqlComando.Transaction.Commit()
            Else
                sqlComando.Transaction.Rollback()

            End If
        Catch ex As Exception
            intOperacion = -1
            strMensajeError = ex.Message
            Try
                sqlComando.Transaction.Rollback()
            Catch ex2 As Exception
                strMensajeError = ex.Message
            End Try

        Finally
            If Me.sqlConexion.State = System.Data.ConnectionState.Open Then
                cerrarConexion()
            End If
        End Try
        Return intOperacion
    End Function


    ''' <summary>
    ''' Metodo que se encarga de realizar un cambio en TransactSQl. 
    ''' El cual debe se le pasan parametros en el query para realizar la operación y que regresa el numero de filas afectadas por la operacion
    ''' </summary>
    ''' <param name="strQuery">Query que modificara la informacion de la Base de Datos. Debe de contener los parametros en la instrucción que se desea realizar.</param>
    ''' <param name="sqlComando">SqlCommand, debe de contener los parametros del la instrucción que se desea realizar</param>
    ''' <returns>Numero de Filas afectadas por la operacion</returns>
    ''' <remarks></remarks>
    Public Function realizarCambioSQL_ConParametros(ByVal strQuery As String, ByVal sqlComando As System.Data.SqlClient.SqlCommand) As Integer
        Dim intOperacion As Integer = -1
        Try
            If Not sqlComando Is Nothing Then
                sqlComando.CommandText = strQuery
                abrirConexion()
                sqlComando.Connection = Me.sqlConexion
                intOperacion = sqlComando.ExecuteNonQuery()
                cerrarConexion()
            End If
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
        Return intOperacion
    End Function

    ''' <summary>
    ''' Metodo que se encarga de realizar un cambio en TransactSQl. 
    ''' El cual debe se le pasan parametros en el query para realizar la operación,
    ''' La transacción y la conexión utilizada de la transacción. No cierra la conexion de la transacción''' 
    ''' </summary>
    ''' <param name="strQuery">Query que modificara la informacion de la Base de Datos. Debe de contener los parametros en la instrucción que se desea realizar.</param>
    ''' <param name="sqlComando">SqlCommand, debe de contener los parametros del la instrucción que se desea realizar</param>
    ''' <param name="sqlConexion">SqlConexion, la conexion de la transaccion que se esta utilizando</param>
    ''' <param name="sqlTransaccion">SqlTransaction, la transacción que se esta ejecutando</param>
    ''' <returns>Numero de Filas afectadas por la operacion</returns>
    ''' <remarks></remarks>
    Public Function realizarTransactCambioSQL_ConParametros(ByVal strQuery As String, ByVal sqlComando As System.Data.SqlClient.SqlCommand, _
                                                            ByVal sqlConexion As System.Data.SqlClient.SqlConnection, ByVal sqlTransaccion As System.Data.SqlClient.SqlTransaction) As Integer
        Dim intOperacion As Integer = -1
        Try
            If Not sqlComando Is Nothing Then
                sqlComando.CommandText = strQuery
                sqlComando.Transaction = sqlTransaccion
                sqlComando.Connection = sqlConexion
                intOperacion = sqlComando.ExecuteNonQuery()
            End If
        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
        Return intOperacion
    End Function

    ''' <summary>
    ''' Metodo que se encarga  de realizar una consulta en SQL con sqlParameter, y obtiene un Data Set con todos los valores de la consulta
    ''' </summary>
    ''' <param name="strQuery">Query a ejecutar en la consulta</param>
    ''' <param name="sqlComando">SqlCommand, debe de contener los parametros del la instrucción que se desea realizar</param>
    ''' <returns> Data Set con el resultado de la consulta </returns>
    ''' <remarks></remarks>
    Public Function consultaSQL_ConParametros( _
                                              ByVal sqlComando As System.Data.SqlClient.SqlCommand) As Data.DataSet
        Dim dsResultado As Data.DataSet = New Data.DataSet()
        Try
            If Not sqlComando Is Nothing Then

                abrirConexion()
                sqlComando.Connection = Me.sqlConexion
                Me.sqlAdaptador = New System.Data.SqlClient.SqlDataAdapter(sqlComando)
                Me.sqlAdaptador.Fill(dsResultado)
                cerrarConexion()
            End If

        Catch ex As Exception
            strMensajeError = ex.Message
        End Try
        Return dsResultado
    End Function

    Public Function obtenerMensajeError() As String
        Return IIf(strMensajeError.Trim.Length > 0, strMensajeError, "")
    End Function





End Class
